#include "dac7611.h"

// pin definitions



// pin definitions
#define DAC_SDI_Pin GPIO_PIN_13
#define DAC_SDI_GPIO_Port GPIOC
#define DAC_CLK_Pin GPIO_PIN_14
#define DAC_CLK_GPIO_Port GPIOC
#define DAC_CS_Pin GPIO_PIN_15
#define DAC_CS_GPIO_Port GPIOC
#define DAC_LD_Pin GPIO_PIN_9
#define DAC_LD_GPIO_Port GPIOB


#define DAC7611_LD_PORT		DAC_LD_GPIO_Port
#define DAC7611_LD_PIN		DAC_LD_Pin
#define DAC7611_CS_PORT		DAC_CS_GPIO_Port
#define DAC7611_CS_PIN		DAC_CS_Pin
#define DAC7611_CLK_PORT	DAC_CLK_GPIO_Port		
#define DAC7611_CLK_PIN		DAC_CLK_Pin
#define DAC7611_SDI_PORT	DAC_SDI_GPIO_Port
#define DAC7611_SDI_PIN		DAC_SDI_Pin

#define DAC7611_SDI(n) 	(n ? HAL_GPIO_WritePin(DAC7611_SDI_PORT, DAC7611_SDI_PIN, GPIO_PIN_SET) : HAL_GPIO_WritePin(DAC7611_SDI_PORT, DAC7611_SDI_PIN, GPIO_PIN_RESET))

#define DAC7611_CLK(n) 	(n ? HAL_GPIO_WritePin(DAC7611_CLK_PORT, DAC7611_CLK_PIN, GPIO_PIN_SET) : HAL_GPIO_WritePin(DAC7611_CLK_PORT, DAC7611_CLK_PIN, GPIO_PIN_RESET))

#define DAC7611_CS(n) 	(n ? HAL_GPIO_WritePin(DAC7611_CS_PORT, DAC7611_CS_PIN, GPIO_PIN_SET) : HAL_GPIO_WritePin(DAC7611_CS_PORT, DAC7611_CS_PIN, GPIO_PIN_RESET))
//ld1
#define DAC7611_LD(n) 	(n ? HAL_GPIO_WritePin(DAC7611_LD_PORT, DAC7611_LD_PIN, GPIO_PIN_SET) : HAL_GPIO_WritePin(DAC7611_LD_PORT, DAC7611_LD_PIN, GPIO_PIN_RESET))



// private methods
void dac7611_clk(void) {

}

void dac7611_init(void) {
	DAC7611_LD(0);
	__nop();
	__nop();
	__nop();
	
	DAC7611_CS(1);
	__nop();
	__nop();
	__nop();
	
	
	DAC7611_CLK(1);
	__nop();
	__nop();
	__nop();
	
	DAC7611_SDI(1);
	__nop();
	__nop();
	__nop();
	
	dac7611(0.0);
}

void dac7611(uint16_t val) {
	DAC7611_CLK(1);
	__nop();
	
	
	DAC7611_LD(1);
	HAL_Delay(1);
	DAC7611_CS(0);
	__nop();
	__nop();
	__nop();
	__nop();
	__nop();
	
	
	for(uint8_t i = 0; i < 12; i++) {
		(val&0x0800) ? DAC7611_SDI(1) : DAC7611_SDI(0);
		DAC7611_CLK(0);
		HAL_Delay(1);
		
		DAC7611_CLK(1);
		HAL_Delay(1);
		
		val <<= 1;
	}
	/*DAC7611_CLK(1);
	__nop();*/
	
	DAC7611_CS(1);
	__nop();
	
	DAC7611_LD(0);
	HAL_Delay(1);
	//DAC7611_LD(1);
}



// public methods
void dac7611_write16b(uint16_t val) {
	
}


















